home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / INTERUPT / INTERU / INTERUPT.PAS < prev   
Pascal/Delphi Source File  |  1988-03-10  |  5KB  |  211 lines

  1. {$R-,S+,I+,D+,T+,F-,V+,B-,N-,L+ }
  2. {$M 4096,0,0 }
  3.  
  4. program interrupt_table (input,output);
  5.  
  6. {
  7.  
  8.   A Program that displays all interrupt vectors.
  9.  
  10.   Version 1.00 - 03/10/88 - First release
  11.  
  12.   Kevin Mess
  13.   PO Box 35
  14.   Boulder City, NV   89005
  15.   Compuserve 71121,3360
  16.  
  17. }
  18.  
  19. uses
  20.   crt,dos,cursors; { Cursors unit as written by Scott Bussinger }
  21.  
  22. const
  23.   bell        = ^G;
  24.  
  25. type
  26.   string4     = string [4];
  27.   keyset      = (ESC,PGUP,PGDN,nothing);
  28.   pointer_rec = record
  29.                   case integer of
  30.                     0 : (address         : pointer);
  31.                     1 : (offset, segment : word)
  32.                 end; { record }
  33.   screentype  = record
  34.                    position : array [1..4000] of byte;
  35.                    x,y      : byte;
  36.                 end; { record }
  37. var
  38.   vector      : array [$00..$FF] of pointer_rec absolute $0000:0000;
  39.   colorscreen : screentype absolute $B800:0000;
  40.   monoscreen  : screentype absolute $B000:0000;
  41.   savedscreen : screentype;
  42.   intnumber   : byte;
  43.   finished    : Boolean;
  44.  
  45. {*************************************}
  46.  
  47. function hex (decimal : word) : string4;
  48.  
  49.    const
  50.       hexdigit  : array [$0..$F] of char = '0123456789ABCDEF';
  51.  
  52.    var
  53.       temp    : string4;
  54.  
  55.    begin
  56.       temp := '';
  57.       temp := hexdigit [ hi (decimal) div 16 ] +
  58.               hexdigit [ hi (decimal) mod 16 ] +
  59.               hexdigit [ lo (decimal) div 16 ] +
  60.               hexdigit [ lo (decimal) mod 16 ] ;
  61.       hex  := temp
  62.    end;
  63.  
  64. {*************************************}
  65.  
  66. procedure frame (x1,y1,x2,y2 : byte);
  67.  
  68.    const
  69.       upperleft  = #201;
  70.       lowerleft  = #200;
  71.       upperright = #187;
  72.       lowerright = #188;
  73.       horizontal = #205;
  74.       vertical   = #186;
  75.  
  76.    var
  77.       i          : byte;
  78.  
  79.    begin
  80.       gotoxy (x1-1,y1-1);
  81.       write  (upperleft);
  82.       gotoxy (x2+1,y1-1);
  83.       write  (upperright);
  84.       gotoxy (x1-1,y2+1);
  85.       write  (lowerleft);
  86.       gotoxy (x2+1,y2+1);
  87.       write  (lowerright);
  88.       for i := x1 to x2 do
  89.          begin
  90.             gotoxy (i,y1-1);
  91.             write  (horizontal);
  92.             gotoxy (i,y2+1);
  93.             write  (horizontal)
  94.          end;
  95.       for i := y1 to y2 do
  96.          begin
  97.             gotoxy (x1-1,i);
  98.             write  (vertical);
  99.             gotoxy (x2+1,i);
  100.             write  (vertical)
  101.          end;
  102.    end; { frame }
  103.  
  104.  
  105. {*************************************}
  106.  
  107. procedure display_screen (first_intnumber : byte);
  108.  
  109.   var
  110.      x,y,
  111.      last_intnumber,
  112.      intnumber      : byte;
  113.  
  114.   begin { display_screen }
  115.      last_intnumber := first_intnumber + $3F;
  116.      x := 5;
  117.      y := 1;
  118.      for intnumber := first_intnumber to last_intnumber do
  119.        with vector [intnumber] do
  120.          begin
  121.            gotoxy (x,y);
  122.            write (copy(hex(intnumber),3,2),hex(segment):6,':',hex(offset));
  123.            inc (y);
  124.            if ((intnumber + 1) mod $10) = 0 then
  125.              if intnumber <> last_intnumber then
  126.                 begin
  127.                   inc (x,19);
  128.                   y := 1
  129.                 end
  130.          end; { with }
  131.   end; { display_screen }
  132.  
  133.  
  134. {*************************************}
  135.  
  136.  
  137. function endkey : keyset;
  138.  
  139.    var
  140.      anykey : char;
  141.      exit   : keyset;
  142.  
  143.    begin
  144.      repeat
  145.         exit := nothing;
  146.         anykey := readkey;
  147.         if anykey = #0 then
  148.            anykey := readkey;
  149.         case anykey of
  150.            #27 : exit := ESC;
  151.            #73 : exit := PGUP;
  152.            #81 : exit := PGDN;
  153.            else  write (bell);
  154.         end; { case }
  155.      until exit in [ESC,PGUP,PGDN];
  156.      endkey := exit
  157.    end;
  158.  
  159. {*************************************}
  160.  
  161. procedure int_table (intnumber : byte);
  162.  
  163.    begin { int_table }
  164.       if monodisplay then
  165.          savedscreen := monoscreen
  166.       else
  167.          begin
  168.             savedscreen := colorscreen;
  169.             textcolor (white);
  170.             textbackground (blue)
  171.          end;
  172.       savedscreen.x := wherex;
  173.       savedscreen.y := wherey;
  174.       makecursor (nocursor);
  175.       frame  (2,2,79,19);
  176.       window (2,2,79,19);
  177.       clrscr;
  178.       gotoxy (12,18);
  179.       write ('PgUp - Previous Page,  PgDn - Next Page,  Esc to Exit');
  180.       finished  := FALSE;
  181.       repeat
  182.          display_screen (intnumber);
  183.          case endkey of
  184.             PGUP : if intnumber >= $40 then
  185.                       dec (intnumber,$40)
  186.                    else
  187.                       intnumber := $C0;
  188.             PGDN : if intnumber <= $80 then
  189.                       inc (intnumber,$40)
  190.                    else
  191.                       intnumber := $00;
  192.             ESC  : finished := TRUE
  193.          end { case }
  194.       until finished;
  195.       window (1,1,80,25);
  196.       if monodisplay then
  197.          monoscreen := savedscreen
  198.       else
  199.          colorscreen  := savedscreen;
  200.       gotoxy (savedscreen.x,savedscreen.y);
  201.       makecursor (restorecursor)
  202.    end;  { int_table }
  203.  
  204. {*************************************}
  205.  
  206.  
  207. begin { main }
  208.    intnumber := $00;
  209.    int_table (intnumber)
  210. end. { main }
  211.